﻿namespace Knownet.BNF.Inline
{
  using System;
  using System.Text;
  using System.Collections;
  using Knownet.AST;

  /// <summary>
  /// BNF 属性
  /// </summary>
  /// <remarks>
  /// 属性是用来描述基本项的更为基本的BNF单位。
  /// 通常属性会随同基本项拷贝，可以通过特定
  /// 的过滤方法改变这一方式。
  /// 我们也可以应用属性来实现文本输出的格式化。
  /// </remarks>
  public class BnfAttribute:SyntaxNode
  {
    #region Consts
    /// <summary>
    /// 属性前缀。
    /// </summary>
    public const string AttributePrefix = "\u0000";
    /// <summary>
    /// 可选属性。
    /// </summary>
    /// <remarks>
    /// 使用\u0000开始，这种字符串一般不会被使用。
    /// </remarks>
    public static readonly BnfAttribute Optional    = BnfAttribute.of("_Optional");
    /// <summary>
    /// 可重复属性。
    /// </summary>
    /// <remarks>
    /// 使用\u0000开始，这种字符串一般不会被使用。
    /// </remarks>
    public static readonly BnfAttribute Repeatable  = BnfAttribute.of("_Repeatable");
    /// <summary>
    /// 文本属性。
    /// </summary>
    /// <remarks>
    /// 使用\u0000开始，这种字符串一般不会被使用。
    /// </remarks>
    public static readonly BnfAttribute Literal     = BnfAttribute.of("_Literal");
    /// <summary>
    /// 引用属性。
    /// </summary>
    /// <remarks>
    /// 使用\u0000开始，这种字符串一般不会被使用。
    /// </remarks>
    public static readonly BnfAttribute Reference   = BnfAttribute.of("_Reference");
    #endregion
    #region Statics
    /// <summary>
    /// 创建新的BnfAttribute实例。
    /// </summary>
    /// <returns></returns>
    public static new BnfAttribute CreateInstance()
    {
      return new BnfAttribute();
    }
    /// <summary>
    /// 创建签名为signature的实例。
    /// </summary>
    public static BnfAttribute of(string signature)
    {
      return new BnfAttribute(signature);
    }
    #endregion
    #region Constructors
    public BnfAttribute()
    {
        
    }
    public BnfAttribute(string signature)
      : base(AttributePrefix + signature)
    {

    }
    #endregion
  }
}
